home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ8801.ZIP / NARO.ZIP / READMAP.C < prev    next >
Text File  |  1987-10-30  |  3KB  |  111 lines

  1. /*
  2.     Copyright (C) 1987 Paradigm Systems Inc.  All rights reserved.
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <malloc.h>
  9.  
  10. #include "loc.h"
  11. #include "externs.h"
  12.  
  13. #define    BUFSIZE    256
  14.  
  15.  
  16. SEG_DESCRIPTOR *build_seg_list()
  17. {
  18.     int count ;
  19.     unsigned long    start_seg, end_seg, length;
  20.     char    seg_name[32], class[32] ;
  21.     char    *buf ;
  22.  
  23.     SEG_DESCRIPTOR *p, *previous, *list_start, *class_start ;
  24.  
  25.     /*
  26.         This function is responsible for the processing of the link map.
  27.         The link map is read and the segment information such as segment
  28.         name, segment length and class name are recorded.
  29.     */
  30.  
  31.     /* Seek to the beginning of the file */
  32.     if (fseek(map_file, 0L, SEEK_SET) != 0)   {
  33.         perror(__FILE__) ;
  34.         exit(1) ;
  35.     }
  36.  
  37.     /* Allocate some memory for the line buffer */
  38.     if ((buf = malloc(BUFSIZE)) == NULL)   {
  39.         perror(__FILE__) ;
  40.         exit(1) ;
  41.     }
  42.  
  43.     /* Search thru the file looking for the start of the segment information */
  44.     while (1)   {
  45.         if (fgets(buf, BUFSIZE, map_file) == NULL)   {
  46.             fprintf(stderr, "Unable to find the segment list in %s\n", map_fname) ;
  47.             exit(1) ;
  48.         }
  49.  
  50.         if (strstr(strupr(buf), "START") != NULL)
  51.             break ;
  52.     }
  53.  
  54.     /* Scan to the start of the first segment record */
  55.     while (fgets(buf, BUFSIZE, map_file) != NULL)   {
  56.         count = sscanf(buf, " %lxH %lxH %lxH %s %s", &start_seg, &end_seg, &length, seg_name, class) ;
  57.         if (count == 5)
  58.             break ;
  59.     }
  60.  
  61.     /* Check if EOF was detected and an error message should be printed */
  62.     if (feof(map_file))   {
  63.         fprintf(stderr, "Unable to find the segment list in %s\n", map_fname) ;
  64.         exit(1) ;
  65.     }
  66.  
  67.     /* Begin processing the list of segments */
  68.     p = previous = NULL ;
  69.     while (count == 5)   {
  70.         /* Allocate some memory to hold the data structure */
  71.         if ((p = (SEG_DESCRIPTOR *) malloc(sizeof (*p))) == NULL)   {
  72.             perror(__FILE__) ;
  73.             exit(1) ;
  74.         }
  75.  
  76.         if (previous == NULL)
  77.             list_start = p ;
  78.         else
  79.             previous->next = p ;
  80.  
  81.         strcpy(p->name, strupr(seg_name)) ;
  82.         strcpy(p->class, strupr(class)) ;
  83.         p->vseg = (unsigned int) (start_seg / 16) ;
  84.         p->offset = (unsigned int) (start_seg % 16) ;
  85.         p->len = (unsigned int) length ;
  86.         p->position = start_seg ;
  87.         p->inited = FALSE ;
  88.         p->romable = FALSE ;
  89.         p->symbols = 0 ;
  90.         p->symbol_list = NULL ;
  91.         p->next = NULL ;
  92.  
  93.         /* Check if the class name has changed and reset the offset */
  94.         if (strcmp(p->class, class_start->class) != 0)   {
  95.             p->pseg = 0 ;
  96.             class_start = p ;
  97.         }
  98.         else
  99.             p->pseg = p->vseg - class_start->vseg ;
  100.  
  101.         previous = p;
  102.  
  103.         /* Read the next line of segment information */
  104.         fgets(buf, BUFSIZE, map_file) ;
  105.         count = sscanf(buf, " %lxH %lxH %lxH %s %s", &start_seg, &end_seg, &length, seg_name, class) ;
  106.     }
  107.  
  108.     free(buf) ;
  109.     return (list_start) ;
  110. }
  111.